package com.shujia.scala

import scala.io.{BufferedSource, Source}


object Demo28Implicit {
  def main(args: Array[String]): Unit = {
    /**
     * 隐式转换  -- 隐式类型转换  -- 可以动态可以对象增加新的方法
     * 1、隐式转换变量
     * 2、隐式转换方法: 可以隐式将方法的参数类型转换成返回值类型
     * 3、隐式转换类
     *
     */

    //显示类型转换
    //        val s:String = "100"
    //        val i: Int = s.toInt
    //        println(i)


    def fun(i: Int): Unit = {
      println(i * i)
    }

    fun(100)
    //显示类型转换
    //fun("100".toInt)


    /**
     * 定义一个隐式转换方法
     * 可以将参数类型转换成返回值类型
     *
     * 隐式转换的方法和方法名无关,和参数类型返回值类有关
     * 同一个作用域中只能存储一个相同类型的隐式转换
     *
     *
     */

    //将String 转换成Int的隐式转换的方法
    //当前作用域中所有的String都可以当成Int类使用
    implicit def strToInt(s: String): Int = {
      println("strToInt被调用")
      Integer.parseInt(s)
    }

    fun("200")
    //等同于
    fun(strToInt("200"))

    implicit def douToInt(d: Double): Int = {
      println("douToInt被调用")
      d.toInt
    }

    fun(3.14)


    /**
     * 应用
     *
     */
    //导入隐式转换
    import com.shujia.scala.Test._

    val studentPsPath: String = "data/students.txt"
    val students: List[String] = studentPsPath.getLines().toList

    students.foreach(println)


    val scores: List[String] = "data/score.txt".getLines().toList



  }

}

object Test {
  /**
   * 隐式转换
   * 可以将参数类型转换成返回值类型
   */
  implicit def read(path: String): BufferedSource = {
    Source.fromFile(path)
  }
}
